Skip to content

[Mass] Introduce element-agnostic FEM mass#6061

Open
alxbilger wants to merge 18 commits intosofa-framework:masterfrom
alxbilger:femmass2
Open

[Mass] Introduce element-agnostic FEM mass#6061
alxbilger wants to merge 18 commits intosofa-framework:masterfrom
alxbilger:femmass2

Conversation

@alxbilger
Copy link
Copy Markdown
Contributor

@alxbilger alxbilger commented Mar 31, 2026

This PR adds a new finite-element mass implementation that builds a sparse global mass matrix from per-element quadrature, using nodal density values instead of a single uniform density.
It also introduces support for computing both kinetic and gravitational potential energy from that mass matrix, along with the corresponding force and matrix-assembly paths.
A new generic nodal-property abstraction was added so density can be stored per node and validated against the mechanical state’s scalar type.
The finite-element helpers were extended with shape-function evaluation and interpolation utilities needed for the mass integration.
The validation example was updated to use the new nodal-density-driven FEM mass setup.

[with-all-tests]


By submitting this pull request, I acknowledge that
I have read, understand, and agree SOFA Developer Certificate of Origin (DCO).


Reviewers will merge this pull-request only if

  • it builds with SUCCESS for all platforms on the CI.
  • it does not generate new warnings.
  • it does not generate new unit test failures.
  • it does not generate new scene test failures.
  • it does not break API compatibility.
  • it is more than 1 week old (or has fast-merge label).

@alxbilger alxbilger added pr: enhancement About a possible enhancement pr: status to review To notify reviewers to review this pull-request pr: highlighted in next release Highlight this contribution in the notes of the upcoming release labels Mar 31, 2026
@alxbilger
Copy link
Copy Markdown
Contributor Author

[ci-build][with-all-tests]

<MechanicalObject template="Vec3" name="state" showObject="true"/>

<MeshMatrixMass massDensity="1100" topology="@grid"/>
<NodalMassDensity property="1100"/>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I find the name Nodal* ambiguous since I wanted to rename some time ago the ConstantForceField and UniformMass respectively as NodalForceField and NodalMass

To me Nodal is inducing the absence of space integration

}

template <class TDataTypes, class TElementType>
void ElementFEMMass<TDataTypes, TElementType>::validateNodalMassDensity()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could have integrated a check on non-negative values

{

template<class T>
class BaseNodalProperty : public virtual sofa::core::objectmodel::BaseComponent
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would need some clarification on this BaseNodalProperty, would you like to extend it in the future for additional information?


const auto NT_N = sofa::type::dyad(N, N);

elementMassMatrix += (weight * density * detJ) * NT_N;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr: enhancement About a possible enhancement pr: highlighted in next release Highlight this contribution in the notes of the upcoming release pr: status to review To notify reviewers to review this pull-request

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

2 participants